////////////////////////////////////////////////////////////////////
// Programme de regroupement/partage par personnage de Chrono Cross
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// Nemesis pour Terminus Traduction (tt_nemesis@yahoo.fr)
// Date de création :		28/01/04
// Dernière modification :	28/01/04
////////////////////////////////////////////////////////////////////

// Entete
#include "Repartition.h"

// Type des blocs de script
typedef struct {
	char *nom;
	int trad;
	int lignes;
} Repart_TPerso;

// Nombre de blocs des scénarii (cf Rooms.cpp)
Repart_TPerso Repart_Persos[REP_PERSOS_MAX];
_int8 Repart_Nb;
_int16 Repart_Persos_Nb;

/*------------------------------------------------------------------
  Initialisation des fichiers pour le regroupement/partage
------------------------------------------------------------------*/
void Repart_Infos (char *fich)
{
	// Fichier des infos
	FILE *infos_f;
	// Nom de l'iso (chemin)
	char infos_nom[REP_NOM_MAX];
	// Ligne
	char ligne[REP_LIGNE_MAX];
	// Nom et indice de personnage lu
	char perso[REP_LIGNE_MAX];
	int num;
	// Nombre de champs d'infos
	int result;
	// Indices
	int p = 0;
	int i;
	// Nombre de lignes par traducteur
	int nb_lignes;

	Main_Message_S("Informations de repartition...","",OK);

	// Ouverture du fichier de listing des persos
	sprintf(infos_nom,"%s%s%s%s.%s",DIR_TXT_IN,fich,
		CD_SUFFIXE,REP_REPART,EXT_TXT);
	infos_f=fopen(infos_nom,"r");

	if (infos_f==NULL)
		Main_Message_S("Erreur d'ouverture du listing.\n","",ER);
	else {
		// Saut de l'entête
		for(i=0;i<4;i++)
			fgets(ligne,REP_LIGNE_MAX,infos_f);
		// Récupération des noms de persos
		while (fgets(ligne,REP_LIGNE_MAX,infos_f)!=NULL)
			// Cas d'un commentaire ou d'un blanc
			if (ligne[0]!=COMMENT) {
				result=sscanf(ligne,"%05d : %03d %s",
					&nb_lignes,&p,perso);
				switch (result) {
				case 3:
					Repart_Persos[p].lignes=nb_lignes;
					Repart_Persos[p].nom=strdup(perso);
					break;
				default:
					Main_Message_S("Listing errone... ","",ER);
				}
			}
		// Fermeture du fichier des infos
		fclose(infos_f);
	}
	Repart_Persos_Nb = p;

	// Initialisation des assignations
	for (p=0;p<=Repart_Persos_Nb;p++) {
		Repart_Persos[p].trad = -1;
	}

	// Ouverture du fichier des infos principales
	sprintf(infos_nom,"%s%s%s%s.%s",
		DIR_INFOS,DIR_INFOS_GRP,fich,REP_SUFFIXE,EXT_INFOS);
	infos_f=fopen(infos_nom,"r");

	if (infos_f==NULL)
		Main_Message_S("Erreur d'ouverture des infos.\n","",ER);
	else {
		// Initialisation (attention, commence à 1)
		Repart_Nb=1;
		// Récupération des noms de persos
		while (fgets(ligne,REP_LIGNE_MAX,infos_f)!=NULL)
			// Cas d'un commentaire ou d'un blanc
			if (ligne[0]!=COMMENT) {
				printf("\n   ");
				nb_lignes=0;
				while(!feof(infos_f) && ligne[0]!=REP_GROUPE) {
					// Nouveau perso (évite redondance)
					sscanf(ligne,"%03d",&num);
					// Incrementation des lignes
					nb_lignes+=Repart_Persos[num].lignes;
					// Affichage du perso
					printf("%s ",Repart_Persos[num].nom);
					// Mise à jour traducteur
					Repart_Persos[num].trad=Repart_Nb;
					// Nouvelle ligne
					fgets(ligne,REP_LIGNE_MAX,infos_f);
				}
				// Affichage du nombre de lignes à faire
				printf("\n   ===== %05d =====",nb_lignes);
				// Nouveau groupe de persos
				Repart_Nb++;
			}
		// Fermeture du fichier des infos
		fclose(infos_f);

		printf("\n   ");
	}

	// Vérification des assignations
	for (p=0;p<=Repart_Persos_Nb;p++) {
		if (Repart_Persos[p].trad == -1) {
			// Affichage du message de réaffectation automatique
			printf("%s non assigne -> %d\n",Repart_Persos[p].nom,
				Repart_Nb-1);
			// Assignation
			Repart_Persos[p].trad = Repart_Nb-1;
		}
	}

	Main_OK();
}

/*------------------------------------------------------------------
  Séparation du script selon les persos choisis par traducteur
--------------------------------------------------------------------
 <- infos = fichiers des informations des partages à faire
------------------------------------------------------------------*/
void Repart_Partage (char *fich)
{
	// Fichiers entrants et sortants
	FILE *in_f,*blocs_f;
	FILE *out_f[REP_TRAD_MAX];
	char fich_nom[REP_NOM_MAX];
	// Infos lues
	int perso,b1,b2,l;
	int result;
	// Indices
	int i,p;
	// Ligne bloc et script
	char ligne_b[REP_LIGNE_MAX];
	char ligne_s[REP_LIGNE_MAX];

	Main_Message_S("Partage selon traducteur : %s...",fich,OK);

	// Ouverture du fichier regroupé
	sprintf(fich_nom,"%s%s%s.%s",DIR_TXT_IN,fich,CD_SUFFIXE,EXT_TXT);
	in_f=fopen(fich_nom,"r");
	// Ouverture du listing des blocs
	sprintf(fich_nom,"%s%s%s%s.%s",DIR_TXT_IN,fich,CD_SUFFIXE,REP_BLOCS,EXT_TXT);
	blocs_f=fopen(fich_nom,"r");

	// Copie effective avec modifs
	if (in_f==NULL)
		Main_Message_S("Script introuvable.\n","",ER);
	else if (blocs_f==NULL)
		Main_Message_S("Infos des blocs introuvables.\n","",ER);
	else {
		// Ouverture des fichiers de sortie
		for(p=0;p<Repart_Nb-1;p++) {
			sprintf(fich_nom,"%s%s%s%s%s%d.%s",DIR_TXT_IN,DIR_TXT_REP,
				fich,CD_SUFFIXE,REP_TRAD,p+1,EXT_TXT);
			out_f[p]=fopen(fich_nom,"w");
		}
		// Saut ou recopie des entêtes du script
		for(i=0;i<4;i++) {
			fgets(ligne_b,REP_LIGNE_MAX,blocs_f);
			fgets(ligne_s,REP_LIGNE_MAX,in_f);
			for(p=0;p<Repart_Nb-1;p++)
				fputs(ligne_s,out_f[p]);
		}
		// Parcours des rooms
		fgets(ligne_b,REP_LIGNE_MAX,blocs_f);
		fgets(ligne_s,REP_LIGNE_MAX,in_f);
		l=1;
		while(!feof(in_f)) {
			// Saut ou recopie des entêtes de room
			for(i=0;i<3;i++) {
				for(p=0;p<Repart_Nb-1;p++)
					fputs(ligne_s,out_f[p]);
				fgets(ligne_s,REP_LIGNE_MAX,in_f);
				fgets(ligne_b,REP_LIGNE_MAX,blocs_f);
			}
			l+=3;
			// Parcours des blocs
			// On a déjà lu la première ligne de bloc
			while(!feof(blocs_f) && ligne_b[0]!=REP_SPEC_CAR) {
				sscanf(ligne_b,"%05d : %03d",&b1,&perso);
				result=sscanf(ligne_s,"%05d",&b2);
				// Test de bug
				if (result!=1 || b1!=b2) {
					Main_Message_D("Bug en ligne %d.\n",l,ER);
					getch();
				}
				// Inscription de la première ligne
				for(p=0;p<Repart_Nb-1;p++) {
					if(Repart_Persos[perso].trad==p+1)
						fputc(REP_TRAD_CAR,out_f[p]);
					else
						fputc(REP_IDEM_CAR,out_f[p]);
					fputc(' ',out_f[p]);
					fputs(ligne_s,out_f[p]);
				}
				// Recopie des autres lignes
				fgets(ligne_s,REP_LIGNE_MAX,in_f);
				l++;
				while(!feof(in_f) && (ligne_s[0]==REP_DEB_A || ligne_s[0]==REP_DEB_1)) {
					for(p=0;p<Repart_Nb-1;p++)
						fputs(ligne_s,out_f[p]);
					fgets(ligne_s,REP_LIGNE_MAX,in_f);
					l++;
					// On a déjà lu la première ligne de room ou bloc
				}
				fgets(ligne_b,REP_LIGNE_MAX,blocs_f);
			}
		}
		// Fermeture des fichiers
		fclose(in_f);
		fclose(blocs_f);
		for(p=0;p<Repart_Nb-1;p++)
			fclose(out_f[p]);
		Main_OK();
	}
}

/*------------------------------------------------------------------
  Regroupement du script à partir des persos choisis par les
  traducteurs et des corrections faites sur le travail accompli
--------------------------------------------------------------------
 <- fich = fichiers des informations des partages à faire
------------------------------------------------------------------*/
void Repart_Regroupe (char *fich)
{
	// Fichiers entrants et sortants
	FILE *out_f,*blocs_f,*correct_f;
	FILE *in_f[REP_TRAD_MAX];
	char fich_nom[REP_NOM_MAX];
	bool in_ouvre;
	// Infos lues
	int perso,b1,b2;
	int result;
	// Indices
	int i,p;
	// Ligne bloc et script
	char ligne_b[REP_LIGNE_MAX];
	char ligne_s[REP_TRAD_MAX][REP_LIGNE_MAX];
	int l[REP_TRAD_MAX];
	// Traductions effectuées
	int trads[REP_TRAD_MAX];

	Main_Message_S("Regroupement des scripts traduits : %s...",fich,OK);

	// Ouverture du listing des blocs
	sprintf(fich_nom,"%s%s%s%s.%s",DIR_TXT_OUT,fich,CD_SUFFIXE,REP_BLOCS,EXT_TXT);
	blocs_f=fopen(fich_nom,"r");
	// Ouverture du fichier de corrections
	sprintf(fich_nom,"%s%s%s%s.%s",DIR_TXT_OUT,fich,CD_SUFFIXE,REP_CORRECT,EXT_TXT);
	correct_f=fopen(fich_nom,"w");
	// Ouverture des fichiers de traduction
	in_ouvre = true;
	for(p=0;p<Repart_Nb-1;p++) {
		sprintf(fich_nom,"%s%s%s%s%s%d.%s",DIR_TXT_OUT,DIR_TXT_REP,
			fich,CD_SUFFIXE,REP_TRAD,p+1,EXT_TXT);
		in_f[p]=fopen(fich_nom,"r");
		// Test d'ouverture de tous les scripts
		in_ouvre &= (in_f[p]!=NULL);
	}

	// Copie effective avec modifs
	if (!in_ouvre)
		Main_Message_S("Script traducteur introuvable.\n","",ER);
	else if (blocs_f==NULL)
		Main_Message_S("Infos des blocs introuvables.\n","",ER);
	else {
		// Ouverture du fichier regroupé
		sprintf(fich_nom,"%s%s%s.%s",DIR_TXT_OUT,fich,CD_SUFFIXE,EXT_TXT);
		out_f=fopen(fich_nom,"w");
		// Saut ou recopie des entêtes du script
		for(i=0;i<4;i++) {
			fgets(ligne_b,REP_LIGNE_MAX,blocs_f);
			for(p=0;p<Repart_Nb-1;p++)
				fgets(ligne_s[p],REP_LIGNE_MAX,in_f[p]);
			fputs(ligne_s[0],out_f);
			fputs(ligne_s[0],correct_f);
		}
		// Parcours des rooms
		fgets(ligne_b,REP_LIGNE_MAX,blocs_f);
		for(p=0;p<Repart_Nb-1;p++) {
			fgets(ligne_s[p],REP_LIGNE_MAX,in_f[p]);
			l[p]=1;
		}
		while(!feof(blocs_f)) {
			// Saut ou recopie des entêtes de room
			for(i=0;i<3;i++) {
				fputs(ligne_s[0],out_f);
				fputs(ligne_s[0],correct_f);
				for(p=0;p<Repart_Nb-1;p++) {
					fgets(ligne_s[p],REP_LIGNE_MAX,in_f[p]);
					l[p]++;
				}
				fgets(ligne_b,REP_LIGNE_MAX,blocs_f);
			}
			// Parcours des blocs
			// On a déjà lu la première ligne de bloc
			while(!feof(blocs_f) && ligne_b[0]!=REP_SPEC_CAR) {
				// Parcours des texte pour trouver les modifiés
				sscanf(ligne_b,"%05d : %03d",&b1,&perso);
				for(p=0;p<Repart_Nb-1;p++) {
					// On se décale de 2 car en pos 0 il y a '$' ou '-' suivi d'un espace
					result=sscanf(&ligne_s[p][2],"%05d",&b2);
					// Test de bug d'alignement Blocs/Script
					if (result!=1 || b1!=b2) {
						Main_Message_D("Bug de decalage en ligne %d.\n",l[p],ER);
						getch();
					}
					// Cas du traducteur désigné
					if(Repart_Persos[perso].trad==p+1) {
						trads[p] = REP_TRADUIT;
						fputs(&ligne_s[p][2],out_f);
						// Le traducteur n'a pas traduit
						if(ligne_s[p][0]!=REP_TRAD_CAR) {
							Main_Message_D("Traducteur %d ->\n",p+1,ER);
							Main_Message_D("Bloc non traduit ligne %d.\n",l[p],ER);
							getch();
						}
					} else {
						// Une correction a été effectuée
						if(ligne_s[p][0]==REP_TRAD_CAR) {
							fprintf(correct_f,"Traducteur %d\n",p+1);
							fputs(&ligne_s[p][2],correct_f);
							trads[p]=REP_CORRIGE;
						} else
							trads[p]=REP_RIEN;
					}
					// Ligne suivante
					fgets(ligne_s[p],REP_LIGNE_MAX,in_f[p]);
					l[p]++;
				}
				// Recopie des autres lignes
				for(p=0;p<Repart_Nb-1;p++) {
					while(!feof(in_f[p]) && (ligne_s[p][0]==REP_DEB_A || ligne_s[p][0]==REP_DEB_1)) {
						switch(trads[p]) {
						case REP_TRADUIT:
							fputs(ligne_s[p],out_f);
							break;
						case REP_CORRIGE:
							fputs(ligne_s[p],correct_f);
							break;
						}
						fgets(ligne_s[p],REP_LIGNE_MAX,in_f[p]);
						l[p]++;
					}
				}
				// On a déjà lu la première ligne de room ou bloc
				fgets(ligne_b,REP_LIGNE_MAX,blocs_f);
			}
		}
		// Fermeture des fichiers
		fclose(out_f);
		fclose(blocs_f);
		fclose(correct_f);
		for(p=0;p<Repart_Nb-1;p++)
			fclose(in_f[p]);
		Main_OK();
	}
}

/*------------------------------------------------------------------
  Uniformisation des retours à la ligne (\r\n)
  du fait des multiples OS utilisés (incompatibilité de merde...)
--------------------------------------------------------------------
 <- fich = fichiers des informations des partages à faire
------------------------------------------------------------------*/
void Repart_Retours (char *fich)
{
	// Fichier entrant et sortant
	FILE *out_f,*in_f;
	char fich_nom[REP_NOM_MAX];
	char fich_nom2[REP_NOM_MAX];
	// Ligne bloc et script
	char ligne[REP_LIGNE_MAX];
	// Indice de traducteur et caractère
	int p,c;

	Main_Message_S("Correction des retours a la ligne...","",OK);

	// Parcours des traductions
	for(p=0;p<Repart_Nb-1;p++) {
		sprintf(fich_nom,"%s%s%s%s%s%d.%s",DIR_TXT_OUT,DIR_TXT_REP,
			fich,CD_SUFFIXE,REP_TRAD,p+1,EXT_TXT);
		sprintf(fich_nom2,"%s%s%s%s%s%s%d.%s",DIR_TXT_OUT,DIR_TXT_REP,
			DIR_TXT_RET,fich,CD_SUFFIXE,REP_TRAD,p+1,EXT_TXT);
		remove(fich_nom2);
		rename(fich_nom,fich_nom2);
		in_f=fopen(fich_nom2,"r");
		// Test d'ouverture du script
		if (in_f==NULL)
			Main_Message_S("Script traducteur introuvable.\n","",ER);
		else {
			out_f=fopen(fich_nom,"w");
			// Parcours des lignes
			while(fgets(ligne,REP_LIGNE_MAX,in_f)!=NULL) {
				c=strlen(ligne)-1;
				// Suppression des retours
				while(ligne[c]==13 || ligne[c]==10) {
					ligne[c]=0;
					c--;
				}
				if (c>=0) {
					// Ajout DU retour
					fputs(ligne,out_f);
					fputs("\n",out_f);
				}
			}
			// Fermeture des fichiers
			fclose(out_f);
			fclose(in_f);
		}
	}

	Main_OK();
}